在 Kubernetes v1.33 之前,如果你想要調整 Pod 的 CPU 或記憶體配置,常見的做法只有兩條路:
直接編輯 Pod:
kubectl edit pod my-api
嘗試修改 resources.requests/limits,結果不是被拒絕,就是只能:
kubectl get pod my-api -o yaml > pod.yaml
kubectl replace --force -f pod.yaml   # 本質是刪掉重建
=服務中斷。
修改 Deployment/StatefulSet 模板:
kubectl set resources deploy my-api \
  --requests=cpu=250m,memory=512Mi \
  --limits=cpu=500m,memory=1Gi
這會觸發滾動更新,舊 Pod 仍需被重建,還是避免不了中斷。
這就是痛點:調整資源 ≠ 重建 Pod。對長連線、stateful workload 或緊急救火的情境尤其不友善。
memory requests 可以降。memory limits,該容器必須設 resizePolicy.memory=RestartContainer,否則會被拒絕。apiVersion: v1
kind: Pod
metadata:
  name: my-api
spec:
  containers:
  - name: app
    image: ghcr.io/example/my-api:1.0.0
    resources:
      requests:
        cpu: "100m"
        memory: "256Mi"
      limits:
        cpu: "200m"
        memory: "512Mi"
kubectl get pod my-api -o yaml > pod.yaml
# 修改 requests/limits
kubectl replace --force -f pod.yaml    # 舊 Pod 被刪 + 新 Pod 被建
kubectl patch pod my-api --type='merge' -p '{
  "spec": {
    "containers": [{
      "name": "app",
      "resources": {
        "requests": {"cpu": "500m", "memory": "512Mi"},
        "limits":   {"cpu": "1",    "memory": "1Gi"}
      }
    }]
  }
}'
驗證:
# 確認容器沒有重啟
kubectl get pod my-api -o jsonpath='{.status.containerStatuses[0].restartCount}{"\\n"}'
# 確認容器 ID 沒變
kubectl get pod my-api -o jsonpath='{.status.containerStatuses[0].containerID}{"\\n"}'
kubectl edit 改 Pod 資源會被拒絕,或只能 replace --force → 中斷。